#!/usr/bin/python

print('当前字母 :')


""" 
标准数据类型：    #内置的 type() 函数可以用来查询变量所指的对象类型。

不可变：
Number（数字）   #包括 int float bool complex(复数)
String（字符串）
Tuple（元组）

可变：
List（列表）
Set（集合）
Dictionary（字典）
 """


""" 
type()不会认为子类是一种父类类型。
isinstance()会认为子类是一种父类类型。
 """


class A:
    pass


class B(A):
    pass


print(isinstance(A(), A))
print(type(A()) == A)
print(isinstance(B(), A))
print(type(B()) == A)


""" 
3、数值的除法包含两个运算符：/ 返回一个浮点数，// 返回一个整数。
4、在混合计算时，Python会把整型转换成为浮点数。
 """
a = 7/4
b = 7//4
c = 5.6-3
print(a, b, c)


""" 
#Python 使用反斜杠 \ 转义特殊字符，如果你不想让反斜杠发生转义，可以在字符串前面添加一个 r，表示原始字符串：
 """
str = "今天天气真的不错"

print(str[3:])
print(str[3])
print(str*2)
print(str + "吗？")


print("Ru\noob")
print(r"Ru\noob")


""" 
List 列表 （类似数组？）   与Python字符串不一样的是，列表中的元素是可以改变的：
 """

list = ["5456", 71, "真的？", 70.5]
Tinlist = ["222", 7984]
print(list[0:])
print(list[0:2])
print(list[1:3])
print(list*2)
print(list + Tinlist)

list[0] = 9
list[1:2] = [8, 7]
print(list)


""" 
元组（tuple）与列表类似，不同之处在于元组的元素不能修改。元组写在小括号 () 里，元素之间用逗号隔开。

元组中的元素类型也可以不相同：
 """

tuple = (5, 6, "ok", 566.3)
Ttuple = (1, 2, "false")
print(tuple[0:])
print(tuple[0:2])
print(tuple[1:3])
print(tuple*2)
print(tuple + Ttuple)

# 构造包含 0 个或 1 个元素的元组比较特殊，所以有一些额外的语法规则：
Stuple = ()  # 空元组
Stuple = (52,)  # 只有一个元素


""" 
字典类似于 JS对象  ES6取值方式
 """

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}

print("dict['Name']: ", dict['Name'])
print("dict['Age']: ", dict['Age'])

del dict['Name']  # 删除键 'Name'
print("dict: ", dict)

dict.clear()     # 清空字典
del dict         # 删除字典


# 次幂运算
a = 2
b = 3
print("a**b:", a**b)


""" 
Python逻辑运算符
and	x and y	布尔"与" - 如果 x 为 False，x and y 返回 False，否则它返回 y 的计算值。	(a and b) 返回 20。
or	x or y	布尔"或" - 如果 x 是非 0，它返回 x 的值，否则它返回 y 的计算值。	(a or b) 返回 10。
not	not x	布尔"非" - 如果 x 为 True，返回 False 。如果 x 为 False，它返回 True。	not(a and b) 返回 False


Python成员运算符
除了以上的一些运算符之外，Python还支持成员运算符，测试实例中包含了一系列的成员，包括字符串，列表或元组。
in	如果在指定的序列中找到值返回 True，否则返回 False。	x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in	如果在指定的序列中没有找到值返回 True，否则返回 False。	x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

 """

a = 11
if a > 10:
    print("a大于10")
elif a > 5:
    print("a大于5小于10")
else:
    print("a小于5")

b = 55

if b < 10 and b > 5:
    print("b大于5小于10")
elif b < 5 or b > 10:
    print("b小于5或者b大于10")
else:
    print("b等于5或者等于10")


""" 
循环语句 while, for
在 python 中，for … else 表示这样的意思，for 中的语句和普通的没有区别，else 中的语句会在循环正常执行完（即 for 不是通过 break 跳出而中断的）的情况下执行，
while … else 也是一样。
 """

q = 0
while q < 10:
    q += 1
    print("this counts = ", q)
    if q == 5:
        continue


print(q)

# 遍历字符串
str = "Python"
for item in str:
    print("当前字符:", item)

# 遍历列表(JS数组)
fruits = ['香蕉', '西瓜', '苹果']
for item in fruits:
    print("当前水果:", item)

# 如果需要索引
for index in range(len(fruits)):
    print("当前水果:", fruits[index], ",索引值:", index)

# 循环案列
for num in range(10, 20):  # 迭代 10 到 20 之间的数字
    for i in range(2, num):  # 根据因子迭代
        if num % i == 0:      # 确定第一个因子
            j = num/i          # 计算第二个因子
            print('%d 等于 %d * %d' % (num, i, j))
            break            # 跳出当前循环
    else:                  # 循环的 else 部分
        print(num, '是一个质数')


""" 
Number类型转换

int(x [,base ])         将x转换为一个整数  
long(x [,base ])        将x转换为一个长整数  
float(x )               将x转换到一个浮点数  
complex(real [,imag ])  创建一个复数  
str(x )                 将对象 x 转换为字符串  
repr(x )                将对象 x 转换为表达式字符串  
eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象  
tuple(s )               将序列 s 转换为一个元组  
list(s )                将序列 s 转换为一个列表  
chr(x )                 将一个整数转换为一个字符  
unichr(x )              将一个整数转换为Unicode字符  
ord(x )                 将一个字符转换为它的整数值  
hex(x )                 将一个整数转换为一个十六进制字符串  
oct(x )                 将一个整数转换为一个八进制字符串
 """

""" 
Python math 模块、cmath 模块
Python 中数学运算常用的函数基本都在 math 模块、cmath 模块中。

Python math 模块提供了许多对浮点数的数学运算函数。

Python cmath 模块包含了一些用于复数运算的函数。

cmath 模块的函数跟 math 模块函数基本一致，区别是 cmath 模块运算的是复数，math 模块运算的是数学运算。

要使用 math 或 cmath 函数必须先导入
import math
 """


""" 
集合set是一个无序的不重复元素序列
可以使用大括号 { } 或者 set() 函数创建集合，注意：创建一个空集合必须用 set() 而不是 { }，因为 { } 是用来创建一个空字典。
 """

# 添加元素

setObj = set()
setObj.add(8)
print(setObj)

# 还有一个方法，也可以添加元素，且参数可以是列表，元组，字典等，语法格式如下：
setObj.update({1, 3})
print(setObj)
setObj.update([7, 6], [8, 9])
print(setObj)

# 移除元素 将元素 x 从集合 s 中移除，如果元素不存在，则会发生错误。
setObj.remove(1)

# 此外还有一个方法也是移除集合中的元素，且如果元素不存在，不会发生错误。格式如下所示：
setObj.discard(10)
print(setObj)


# 我们也可以设置随机删除集合中的一个元素，语法格式如下：

print("随即删除:", setObj.pop())
print(len(setObj))

# 判断元素是否在集合中存在
print(8 in setObj)

# 清空集合
setObj.clear()
